home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / MSDOS / grbgi.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  4KB  |  210 lines

  1. /* --------------------------------- grbgi.c --------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Vga graphics driver (uses Borland BGI graphics library).
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12. #ifdef FLY8_BC
  13.  
  14. #include <conio.h>
  15. #include <graphics.h>
  16.  
  17.  
  18. #define DOSYNC        0x0001
  19. #define BIGPAGE        0x0006
  20. #define POSTSYNC    0x0008
  21. #define INITED        0x1000
  22.  
  23. #define MAX_SYNC_WAIT    1000L    /* 1 second is long enough */
  24.  
  25. static Uint    LastColor = (Uint)-1;
  26.  
  27. LOCAL_FUNC int FAR
  28. BGISetVisual (int page)
  29. {
  30.     Ulong    lasttime;
  31.     int    port;
  32.  
  33.     if (2 == CS->device->colors)
  34.         port = 0x3ba;        /* monochrome */
  35.     else
  36.         port = 0x3da;        /* colour */
  37.     lasttime = st.lasttime;
  38.  
  39.     if (CS->device->flags & DOSYNC) {
  40.         while (inp (port) & 0x01) {    /* wait for Display Enabled */
  41.             sys_poll (26);
  42.             if (st.lasttime - lasttime > MAX_SYNC_WAIT) {
  43.                 LogPrintf ("%s: sync timed out\n", Gr->name);
  44.                 die ();
  45.             }
  46.         }
  47.     }
  48.     setvisualpage(page);
  49.     if (CS->device->flags & (DOSYNC|POSTSYNC)) {
  50.         while (inp (port) & 0x08) {    /* wait for Vert Sync start */
  51.             sys_poll (27);
  52.             if (st.lasttime - lasttime > MAX_SYNC_WAIT) {
  53.                 LogPrintf ("%s: sync timed out\n", Gr->name);
  54.                 die ();
  55.             }
  56.         }
  57.         while (!(inp (port) & 0x08)) {    /* wait for Vert Sync end */
  58.             sys_poll (28);
  59.             if (st.lasttime - lasttime > MAX_SYNC_WAIT) {
  60.                 LogPrintf ("%s: sync timed out\n", Gr->name);
  61.                 die ();
  62.             }
  63.         }
  64.     }
  65.     return (0);
  66. }
  67.  
  68. LOCAL_FUNC int FAR
  69. BGISetActive (int page)
  70. {
  71.     setactivepage (page);
  72.     return (0);
  73. }
  74.  
  75. LOCAL_FUNC void FAR
  76. BGIDrawTo (int x, int y, Uint color)
  77. {
  78.     if (color != LastColor) {
  79.         setcolor (color);
  80.         LastColor = color;
  81.     }
  82.     lineto (x, y);
  83. }
  84.  
  85. LOCAL_FUNC int FAR
  86. BGIWriteMode (int mode)
  87. {
  88.     switch (mode) {
  89.     case T_MSET:
  90.         setwritemode (COPY_PUT);
  91.         break;
  92.     case T_MOR:
  93.         exit(99);
  94.         break;
  95.     case T_MXOR:
  96.         setwritemode (XOR_PUT);
  97.         break;
  98.     }
  99.     return (0);
  100. }
  101.  
  102. LOCAL_FUNC int FAR
  103. BGISetPalette (int index, long c)
  104. {
  105.     setrgbpalette (index, C_RGB_R (c), C_RGB_G (c), C_RGB_B (c));
  106.     return (0);
  107. }
  108.  
  109. LOCAL_FUNC int FAR
  110. BGIInit (DEVICE *dev, char *options)
  111. {
  112.     long    temp;
  113.     int    gdriver = DETECT;    /* auto detection */
  114.     int    gmode;
  115.     int    errorcode;
  116.  
  117. /* initialize graphics mode
  118. */
  119.     initgraph (&gdriver, &gmode, "");
  120.     if (grOk != (errorcode = graphresult ())) {
  121.         LogPrintf ("GrBGI Graphics error: %s\n", 
  122.             grapherrormsg (errorcode));
  123.         return (1);        /* return with error code */
  124.     }
  125.  
  126.     dev->sizex = getmaxx () +1;
  127.     dev->sizey = getmaxy () +1;
  128.  
  129.     dev->npages = 1;
  130.  
  131.     if (get_narg (options, "shutters=", &temp))
  132.         st.misc[7] = (int)temp;
  133.     else
  134.         st.misc[7] = 0;
  135.  
  136.     Gr->flags |= INITED;
  137.  
  138.     return (0);
  139. }
  140.  
  141. LOCAL_FUNC void FAR
  142. BGITerm (DEVICE *dev)
  143. {
  144.     if (!(Gr->flags & INITED))
  145.         return;
  146.     Gr->flags &= ~INITED;
  147.  
  148.     dev = dev;
  149.     closegraph ();
  150. }
  151.  
  152. LOCAL_FUNC void FAR
  153. BGIEllipse (int x1, int y1, int rx, int ry, Uint color)
  154. {
  155.     if (color != LastColor) {
  156.         setcolor (color);
  157.         LastColor = color;
  158.     }
  159.     ellipse (x1, y1, 0, 0, rx, ry);
  160. }
  161.  
  162. LOCAL_FUNC void FAR
  163. BGIClear (SCREEN *scr)
  164. {
  165.     setbkcolor (scr->BgColor);
  166.     cleardevice ();
  167. }
  168.  
  169. LOCAL_FUNC int FAR
  170. BGIShutters (int eye)
  171. {
  172.     if (st.misc[7]) {
  173.         if (eye >= 0)
  174.             outp (st.misc[7]+4, 1+2*eye);
  175.         else if (-1 == eye)
  176.             outp (st.misc[7]+4, 1);        /* on */
  177.         else if (-2 == eye)
  178.             outp (st.misc[7]+4, 0);        /* off */
  179.         return (0);                /* have shutters */
  180.     } else
  181.         return (1);                /* no shutters */
  182. }
  183.  
  184. struct GrDriver NEAR GrBGI = {
  185.     "GrBGI",
  186.     0,
  187.     NULL,    /* extra */
  188.     0,
  189.     BGIInit,
  190.     BGITerm,
  191.     moveto,
  192.     BGIDrawTo,
  193.     BGISetVisual,
  194.     BGISetActive,
  195.     0    /* BGIClear */,
  196.     BGIWriteMode,
  197.     BGISetPalette,
  198.     BGIEllipse,
  199.     0,    /* Flush */
  200.     BGIShutters
  201. };
  202.  
  203. #undef DOSYNC
  204. #undef BIGPAGE
  205. #undef POSTSYNC
  206. #undef INITED
  207. #undef MAX_SYNC_WAIT
  208.  
  209. #endif /* ifdef FLY8_BC */
  210.